/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.senaclem.aspera.vista;

import co.edu.senaclem.logica.InstructorLogicaLocal;
import co.edu.senaclem.logica.PersonalLogicaLocal;
import co.edu.senaclem.logica.UsuariosLogicaLocal;
import co.edu.senaclem.modelo.Instructor;
import co.edu.senaclem.modelo.Personal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.password.Password;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author DILOVE
 */
@ManagedBean(name = "instructorVista")
@RequestScoped
public class InstructorVista {

    @EJB
    private InstructorLogicaLocal instructorLogica;

    @EJB
    private UsuariosLogicaLocal usuariosLogica;

    @EJB
    private PersonalLogicaLocal personalLogica;

    private SelectOneMenu cmbTipoInstructor;
    private InputText txtIdentificacion;
    private InputText txtNombre;
    private InputText txtApellido;
    private InputText txtCorreo;
    private InputText txtTelefono;
    private Password txtClave;
    private CommandButton btnRegistrar;
    private CommandButton btnModificar;
    private CommandButton btnEliminar;
    private CommandButton btnLimpiar;
    private Instructor selectedInstructor;
    private List<Instructor> listaInstructores = null;

    public void onEliminacionConfirm(ActionEvent actionEvent) {
        borrar_action();
    }

    /**
     * @return the instructorLogica
     */
    public InstructorLogicaLocal getInstructorLogica() {
        return instructorLogica;
    }

    /**
     * @param instructorLogica the instructorLogica to set
     */
    public void setInstructorLogica(InstructorLogicaLocal instructorLogica) {
        this.instructorLogica = instructorLogica;
    }

    /**
     * @return the cmbTipoInstructor
     */
    public SelectOneMenu getCmbTipoInstructor() {
        return cmbTipoInstructor;
    }

    /**
     * @param cmbTipoInstructor the cmbTipoInstructor to set
     */
    public void setCmbTipoInstructor(SelectOneMenu cmbTipoInstructor) {
        this.cmbTipoInstructor = cmbTipoInstructor;
    }

    /**
     * @return the txtIdentificacion
     */
    public InputText getTxtIdentificacion() {
        return txtIdentificacion;
    }

    /**
     * @param txtIdentificacion the txtIdentificacion to set
     */
    public void setTxtIdentificacion(InputText txtIdentificacion) {
        this.txtIdentificacion = txtIdentificacion;
    }

    /**
     * @return the txtNombre
     */
    public InputText getTxtNombre() {
        return txtNombre;
    }

    /**
     * @param txtNombre the txtNombre to set
     */
    public void setTxtNombre(InputText txtNombre) {
        this.txtNombre = txtNombre;
    }

    /**
     * @return the txtClave
     */
    public Password getTxtClave() {
        return txtClave;
    }

    /**
     * @param txtClave the txtClave to set
     */
    public void setTxtClave(Password txtClave) {
        this.txtClave = txtClave;
    }

    /**
     * @return the btnRegistrar
     */
    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    /**
     * @param btnRegistrar the btnRegistrar to set
     */
    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    /**
     * @return the btnModificar
     */
    public CommandButton getBtnModificar() {
        return btnModificar;
    }

    /**
     * @param btnModificar the btnModificar to set
     */
    public void setBtnModificar(CommandButton btnModificar) {
        this.btnModificar = btnModificar;
    }

    /**
     * @return the btnEliminar
     */
    public CommandButton getBtnEliminar() {
        return btnEliminar;
    }

    /**
     * @param btnEliminar the btnEliminar to set
     */
    public void setBtnEliminar(CommandButton btnEliminar) {
        this.btnEliminar = btnEliminar;
    }

    /**
     * @return the btnLimpiar
     */
    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    /**
     * @param btnLimpiar the btnLimpiar to set
     */
    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    /**
     * @return the selectedInstructor
     */
    public Instructor getSelectedInstructor() {
        return selectedInstructor;
    }

    /**
     * @param selectedInstructor the selectedInstructor to set
     */
    public void setSelectedInstructor(Instructor selectedInstructor) {
        this.selectedInstructor = selectedInstructor;
    }

    public void registrar_action() {
        //System.out.println("Crear");

        if (usuariosLogica.validarSesion()) {
            try {
                Instructor instructor = new Instructor();
                Long documento = Long.parseLong(txtIdentificacion.getValue().toString());
                Personal nuevoPersonal = new Personal();
                nuevoPersonal.setDocumento(documento);
                nuevoPersonal.setNombre(txtNombre.getValue().toString().toUpperCase());
                nuevoPersonal.setApellido(txtApellido.getValue().toString().toUpperCase());
                nuevoPersonal.setCorreo(txtCorreo.getValue().toString().toUpperCase());
                nuevoPersonal.setTelefono(txtTelefono.getValue().toString());
                if (!txtClave.isDisabled()) {
                    nuevoPersonal.setClave(txtClave.getValue().toString());
                }

                String existePersonal = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("existePersonal");
                if (existePersonal.equals("no")) {
                    personalLogica.insertar(nuevoPersonal);
                }

                instructor.setDocumento(nuevoPersonal);
                instructor.setTipo(cmbTipoInstructor.getValue().toString());

                instructorLogica.registrar(instructor);
                //por si el usuario cambia algún dato del personal
                personalLogica.modificar(nuevoPersonal);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Instructor Se Registró Con Éxito"));

                limpiar_action();
            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento Debe Ser Numérico!"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }

            listaInstructores = null;
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void modificar_action() {
        //System.out.println("Modificar Instructor");
        if (usuariosLogica.validarSesion()) {
            try {
                Instructor instructor = new Instructor();
                Long documento = Long.parseLong(txtIdentificacion.getValue().toString());
                Personal miPersonal = new Personal();
                miPersonal.setDocumento(documento);
                miPersonal.setNombre(txtNombre.getValue().toString().toUpperCase());
                miPersonal.setApellido(txtApellido.getValue().toString().toUpperCase());
                miPersonal.setCorreo(txtCorreo.getValue().toString().toUpperCase());
                miPersonal.setTelefono(txtTelefono.getValue().toString().toUpperCase());
                //miPersonal.setClave(passClave.getValue().toString());

                personalLogica.modificar(miPersonal);

                instructor.setDocumento(miPersonal);
                instructor.setTipo(cmbTipoInstructor.getValue().toString());

                instructorLogica.modificar(instructor);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Instructor Se Modificó Con Éxito"));
                limpiar_action();
            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento Debe Ser Numérico!"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }

            listaInstructores = null;
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void borrar_action() {
        //System.out.println("Borrar Instructor");
        if (usuariosLogica.validarSesion()) {
            try {

                Long documento = Long.parseLong(txtIdentificacion.getValue().toString());
                Personal miPersonal = new Personal();
                miPersonal.setDocumento(documento);
                Instructor instructor = new Instructor();
                instructor.setDocumento(miPersonal);

                instructorLogica.eliminar(instructor);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Instructor Se Eliminó Con Éxito"));
                limpiar_action();
            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento Debe Ser Numérico!"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }

            listaInstructores = null;
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void limpiar_action() {
        //System.out.println("Limpiar");
        if (usuariosLogica.validarSesion()) {
            cmbTipoInstructor.setValue("ninguno");
            txtIdentificacion.setValue("");
            txtIdentificacion.setDisabled(false);
            txtNombre.setValue("");
            txtApellido.setValue("");
            txtCorreo.setValue("");
            txtTelefono.setValue("");
            txtClave.setValue("");
            btnRegistrar.setDisabled(false);
            btnEliminar.setDisabled(true);
            btnModificar.setDisabled(true);
            txtClave.setDisabled(false);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * @return the listaInstructores
     */
    public List<Instructor> getListaInstructores() {
        if (listaInstructores == null) {
            try {
                //System.out.println("Va a consultar los Instructores");
                setListaInstructores(instructorLogica.consultar());
            } catch (Exception ex) {
                Logger.getLogger(InstructorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return listaInstructores;
    }

    public void txtIdentificacion_listener() {
        //System.out.println("listener txtIdentificacion Instrcutor");

        if (usuariosLogica.validarSesion()) {
            Instructor entityInstructor = null;
            Personal entityPersonal = null;

            try {
                Long documento = Long.parseLong(txtIdentificacion.getValue().toString());
                entityPersonal = personalLogica.consultarPorId(documento);
                entityInstructor = instructorLogica.consultarPorId(documento);
            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento Debe Ser Numérico!"));
            } catch (Exception ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", ex.getMessage()));
            }

            //si el Instructor no existe limpia los campos y habilita el boton de crear y deshabilita modificar
            //y eliminar
            if (entityPersonal == null) //si la persona no existe
            {
                btnModificar.setDisabled(true);
                btnEliminar.setDisabled(true);
                btnRegistrar.setDisabled(false);

                txtNombre.setValue("");
                txtApellido.setValue("");
                txtCorreo.setValue("");
                txtTelefono.setValue("");
                cmbTipoInstructor.setValue("-1");
                txtClave.setDisabled(false);

                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "no");
            } else if (entityInstructor == null) //si la persona existe pero no como instructor
            {
                txtNombre.setValue(entityPersonal.getNombre());
                txtApellido.setValue(entityPersonal.getApellido());
                txtCorreo.setValue(entityPersonal.getCorreo());
                txtTelefono.setValue(entityPersonal.getTelefono());
                txtClave.setValue(entityPersonal.getClave());
                txtClave.setDisabled(true);
                cmbTipoInstructor.setValue("-1");

                btnModificar.setDisabled(true);
                btnEliminar.setDisabled(true);
                btnRegistrar.setDisabled(false);
                //el personal ya existe por tanto guarda el estado en una variable de sesion
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
            } else //si ya existe como coordinador
            {
                txtNombre.setValue(entityInstructor.getDocumento().getNombre());
                txtApellido.setValue(entityInstructor.getDocumento().getApellido());
                txtCorreo.setValue(entityInstructor.getDocumento().getCorreo());
                txtTelefono.setValue(entityInstructor.getDocumento().getTelefono());
                txtClave.setValue(entityPersonal.getClave());
                txtClave.setDisabled(true);
                cmbTipoInstructor.setValue(entityInstructor.getTipo());

                btnModificar.setDisabled(false);
                btnEliminar.setDisabled(false);
                btnRegistrar.setDisabled(true);
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
            }

        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void onRowSelect(SelectEvent event) {
        // System.out.println("Selecciono el Instructor");
        if (usuariosLogica.validarSesion()) {
            Instructor ins = (Instructor) event.getObject();
        //System.out.println("Instructor Seleccionado"+ins.getDocumento().getNombre());
            //FacesMessage msg = new FacesMessage("Instructor Seleccionado", ins.getNombreinstructor());  
            txtIdentificacion.setValue(ins.getDocumento().getDocumento());
            txtNombre.setValue(ins.getDocumento().getNombre());
            txtApellido.setValue(ins.getDocumento().getApellido());
            txtCorreo.setValue(ins.getDocumento().getCorreo());
            txtTelefono.setValue(ins.getDocumento().getTelefono());
            txtClave.setDisabled(true);
            cmbTipoInstructor.setValue(ins.getTipo());

            btnRegistrar.setDisabled(true);
            btnEliminar.setDisabled(false);
            btnModificar.setDisabled(false);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * @param listaInstructores the listaInstructores to set
     */
    public void setListaInstructores(List<Instructor> listaInstructores) {
        this.listaInstructores = listaInstructores;
    }

    /**
     * @return the txtApellido
     */
    public InputText getTxtApellido() {
        return txtApellido;
    }

    /**
     * @param txtApellido the txtApellido to set
     */
    public void setTxtApellido(InputText txtApellido) {
        this.txtApellido = txtApellido;
    }

    /**
     * @return the txtCorreo
     */
    public InputText getTxtCorreo() {
        return txtCorreo;
    }

    /**
     * @param txtCorreo the txtCorreo to set
     */
    public void setTxtCorreo(InputText txtCorreo) {
        this.txtCorreo = txtCorreo;
    }

    /**
     * @return the txtTelefono
     */
    public InputText getTxtTelefono() {
        return txtTelefono;
    }

    /**
     * @param txtTelefono the txtTelefono to set
     */
    public void setTxtTelefono(InputText txtTelefono) {
        this.txtTelefono = txtTelefono;
    }

    public void handleFileUpload(FileUploadEvent event) {
        //System.out.println("Evento File upload!!!");

        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        String rutaDestino = (String) servletContext.getRealPath("/excel"); // Sustituye "/" por el directorio ej: "/upload"

        //System.out.println("Ruta Server: " + rutaDestino);
        try {
            copyFile(rutaDestino, event.getFile().getFileName(), event.getFile().getInputstream());
            Map resultado = instructorLogica.importarInstructores(rutaDestino + "\\" + event.getFile().getFileName());

            List<String> mensajesErrores = (List<String>) resultado.get("Errores");
            List<String> mensajesInfo = (List<String>) resultado.get("Info");

            for (int i = 0; i < mensajesInfo.size(); i++) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Ok: ", mensajesInfo.get(i)));
            }

            for (int i = 0; i < mensajesErrores.size(); i++) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Errores: ", mensajesErrores.get(i)));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception ex) {
            Logger.getLogger(AprendizVista.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void copyFile(String rutaDestino, String fileName, InputStream in) {
        try {
            OutputStream out = new FileOutputStream(new File(rutaDestino + "\\" + fileName));
            //System.out.println("Ruta Archivo: " + rutaDestino + "\\" +fileName);
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            in.close();
            out.flush();
            out.close();
            //System.out.println("New file created!");
        } catch (IOException e) {
            //System.out.println(e.getMessage());
        }
    }

}
